package com.sheng.leetcode.year2022.month09.day04;

import org.junit.Test;

/**
 * @author liusheng
 * @date 2022/09/05
 *
 * 1582. 二进制矩阵中的特殊位置
 *
 * 给你一个大小为 rows x cols 的矩阵 mat，其中 mat[i][j] 是 0 或 1，请返回 矩阵  mat 中特殊位置的数目 。
 * 特殊位置 定义：如果 mat[i][j] == 1 并且第 i 行和第 j 列中的所有其他元素均为 0（行和列的下标均 从 0 开始 ），则位置 (i, j) 被称为特殊位置。
 *
 * 示例 1：
 * 输入：mat = [[1,0,0],
 *              [0,0,1],
 *              [1,0,0]]
 * 输出：1
 * 解释：(1,2) 是一个特殊位置，因为 mat[1][2] == 1 且所处的行和列上所有其他元素都是 0
 *
 * 示例 2：
 * 输入：mat = [[1,0,0],
 *              [0,1,0],
 *              [0,0,1]]
 * 输出：3
 * 解释：(0,0), (1,1) 和 (2,2) 都是特殊位置
 *
 * 示例 3：
 * 输入：mat = [[0,0,0,1],
 *              [1,0,0,0],
 *              [0,1,1,0],
 *              [0,0,0,0]]
 * 输出：2
 *
 * 示例 4：
 * 输入：mat = [[0,0,0,0,0],
 *              [1,0,0,0,0],
 *              [0,1,0,0,0],
 *              [0,0,1,0,0],
 *              [0,0,0,1,1]]
 * 输出：3
 *
 * 提示：
 *
 * rows == mat.length
 * cols == mat[i].length
 * 1 <= rows, cols <= 100
 * mat[i][j] 是 0 或 1
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/special-positions-in-a-binary-matrix
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class LeetCode1582 {

    @Test
    public void test01() {
//        int[][] mat = {{1,0,0},{0,0,1},{1,0,0}};
//        int[][] mat = {{1,0,0},{0,1,0},{0,0,1}};
//        int[][] mat = {{0,0,0,1},{1,0,0,0},{0,1,1,0},{0,0,0,0}};
        int[][] mat = {{0,0,0,0,0},{1,0,0,0,0},{0,1,0,0,0},{0,0,1,0,0},{0,0,0,1,1}};
        System.out.println(new Solution().numSpecial(mat));
    }
}
//class Solution {
//    public int numSpecial(int[][] mat) {
//        int rows = mat.length;
//        int cols = mat[0].length;
//        int count = 0;
//        for (int i = 0; i < rows; i++) {
//            int y = 0;
//            for (int j = 0; j < cols; j++) {
//                if (mat[i][j] == 1 && y++ == 0) {
//                    boolean flag1 = true;
//                    boolean flag2 = true;
//                    for (int k = 0; k < rows; k++) {
//                        if (k != i && mat[k][j] != 0) {
//                            flag1 = false;
//                            break;
//                        }
//                    }
//                    for (int k = 0; k < cols; k++) {
//                        if (k != j && mat[i][k] != 0) {
//                            flag2 = false;
//                            break;
//                        }
//                    }
//                    if (flag1 && flag2) {
//                        count++;
//                    }
//                }
//            }
//        }
//        return count;
//    }
//}

class Solution {
    public int numSpecial(int[][] mat) {
        // 获取每一行的累加放到一个数组中，每一列的累加，放到另一个数组中
        int n = mat.length, m = mat[0].length, ans = 0;
        int[] r = new int[n], c = new int[m];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                r[i] += mat[i][j]; c[j] += mat[i][j];
            }
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                // 如果当前位置的值为1，并且当前行的累加，当前列的累加都为1时，当前位置为特殊位置
                if (mat[i][j] == 1 && r[i] == 1 && c[j] == 1) {
                    ans++;
                }
            }
        }
        return ans;
    }
}
//
//作者：AC_OIer
//链接：https://leetcode.cn/problems/special-positions-in-a-binary-matrix/solution/by-ac_oier-61w0/
//来源：力扣（LeetCode）
//著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
